{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# 示例：2012联邦选举委员会数据库\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from mpl_toolkits.basemap import Basemap\n",
    "from mpl_toolkits.basemap import cm\n",
    "from matplotlib import rcParams\n",
    "from matplotlib.collections import LineCollection\n",
    "from pandas import DataFrame, Series\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>cmte_id</th>\n",
       "      <th>cand_id</th>\n",
       "      <th>cand_nm</th>\n",
       "      <th>contbr_nm</th>\n",
       "      <th>contbr_city</th>\n",
       "      <th>contbr_st</th>\n",
       "      <th>contbr_zip</th>\n",
       "      <th>contbr_employer</th>\n",
       "      <th>contbr_occupation</th>\n",
       "      <th>contb_receipt_amt</th>\n",
       "      <th>contb_receipt_dt</th>\n",
       "      <th>receipt_desc</th>\n",
       "      <th>memo_cd</th>\n",
       "      <th>memo_text</th>\n",
       "      <th>form_tp</th>\n",
       "      <th>file_num</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>C00410118</td>\n",
       "      <td>P20002978</td>\n",
       "      <td>Bachmann, Michelle</td>\n",
       "      <td>HARVEY, WILLIAM</td>\n",
       "      <td>MOBILE</td>\n",
       "      <td>AL</td>\n",
       "      <td>366010290</td>\n",
       "      <td>RETIRED</td>\n",
       "      <td>RETIRED</td>\n",
       "      <td>250.0</td>\n",
       "      <td>20-JUN-11</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>SA17A</td>\n",
       "      <td>736166</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>C00410118</td>\n",
       "      <td>P20002978</td>\n",
       "      <td>Bachmann, Michelle</td>\n",
       "      <td>HARVEY, WILLIAM</td>\n",
       "      <td>MOBILE</td>\n",
       "      <td>AL</td>\n",
       "      <td>366010290</td>\n",
       "      <td>RETIRED</td>\n",
       "      <td>RETIRED</td>\n",
       "      <td>50.0</td>\n",
       "      <td>23-JUN-11</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>SA17A</td>\n",
       "      <td>736166</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>C00410118</td>\n",
       "      <td>P20002978</td>\n",
       "      <td>Bachmann, Michelle</td>\n",
       "      <td>SMITH, LANIER</td>\n",
       "      <td>LANETT</td>\n",
       "      <td>AL</td>\n",
       "      <td>368633403</td>\n",
       "      <td>INFORMATION REQUESTED</td>\n",
       "      <td>INFORMATION REQUESTED</td>\n",
       "      <td>250.0</td>\n",
       "      <td>05-JUL-11</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>SA17A</td>\n",
       "      <td>749073</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>C00410118</td>\n",
       "      <td>P20002978</td>\n",
       "      <td>Bachmann, Michelle</td>\n",
       "      <td>BLEVINS, DARONDA</td>\n",
       "      <td>PIGGOTT</td>\n",
       "      <td>AR</td>\n",
       "      <td>724548253</td>\n",
       "      <td>NONE</td>\n",
       "      <td>RETIRED</td>\n",
       "      <td>250.0</td>\n",
       "      <td>01-AUG-11</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>SA17A</td>\n",
       "      <td>749073</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>C00410118</td>\n",
       "      <td>P20002978</td>\n",
       "      <td>Bachmann, Michelle</td>\n",
       "      <td>WARDENBURG, HAROLD</td>\n",
       "      <td>HOT SPRINGS NATION</td>\n",
       "      <td>AR</td>\n",
       "      <td>719016467</td>\n",
       "      <td>NONE</td>\n",
       "      <td>RETIRED</td>\n",
       "      <td>300.0</td>\n",
       "      <td>20-JUN-11</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>SA17A</td>\n",
       "      <td>736166</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     cmte_id    cand_id             cand_nm           contbr_nm  \\\n",
       "0  C00410118  P20002978  Bachmann, Michelle     HARVEY, WILLIAM   \n",
       "1  C00410118  P20002978  Bachmann, Michelle     HARVEY, WILLIAM   \n",
       "2  C00410118  P20002978  Bachmann, Michelle       SMITH, LANIER   \n",
       "3  C00410118  P20002978  Bachmann, Michelle    BLEVINS, DARONDA   \n",
       "4  C00410118  P20002978  Bachmann, Michelle  WARDENBURG, HAROLD   \n",
       "\n",
       "          contbr_city contbr_st contbr_zip        contbr_employer  \\\n",
       "0              MOBILE        AL  366010290                RETIRED   \n",
       "1              MOBILE        AL  366010290                RETIRED   \n",
       "2              LANETT        AL  368633403  INFORMATION REQUESTED   \n",
       "3             PIGGOTT        AR  724548253                   NONE   \n",
       "4  HOT SPRINGS NATION        AR  719016467                   NONE   \n",
       "\n",
       "       contbr_occupation  contb_receipt_amt contb_receipt_dt receipt_desc  \\\n",
       "0                RETIRED              250.0        20-JUN-11          NaN   \n",
       "1                RETIRED               50.0        23-JUN-11          NaN   \n",
       "2  INFORMATION REQUESTED              250.0        05-JUL-11          NaN   \n",
       "3                RETIRED              250.0        01-AUG-11          NaN   \n",
       "4                RETIRED              300.0        20-JUN-11          NaN   \n",
       "\n",
       "  memo_cd memo_text form_tp  file_num  \n",
       "0     NaN       NaN   SA17A    736166  \n",
       "1     NaN       NaN   SA17A    736166  \n",
       "2     NaN       NaN   SA17A    749073  \n",
       "3     NaN       NaN   SA17A    749073  \n",
       "4     NaN       NaN   SA17A    736166  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec = pd.read_csv('../data/fec/P00000001-ALL.csv', low_memory=False)\n",
    "fec.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "cmte_id                             C00431445\n",
       "cand_id                             P80003338\n",
       "cand_nm                         Obama, Barack\n",
       "contbr_nm                         ELLMAN, IRA\n",
       "contbr_city                             TEMPE\n",
       "contbr_st                                  AZ\n",
       "contbr_zip                          852816719\n",
       "contbr_employer      ARIZONA STATE UNIVERSITY\n",
       "contbr_occupation                   PROFESSOR\n",
       "contb_receipt_amt                          50\n",
       "contb_receipt_dt                    01-DEC-11\n",
       "receipt_desc                              NaN\n",
       "memo_cd                                   NaN\n",
       "memo_text                                 NaN\n",
       "form_tp                                 SA17A\n",
       "file_num                               772372\n",
       "Name: 123456, dtype: object"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec.iloc[123456] # 随便抽取一条记录"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['Bachmann, Michelle', 'Romney, Mitt', 'Obama, Barack',\n",
       "       \"Roemer, Charles E. 'Buddy' III\", 'Pawlenty, Timothy',\n",
       "       'Johnson, Gary Earl', 'Paul, Ron', 'Santorum, Rick', 'Cain, Herman',\n",
       "       'Gingrich, Newt', 'McCotter, Thaddeus G', 'Huntsman, Jon',\n",
       "       'Perry, Rick'], dtype=object)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "unique_cands = fec.cand_nm.unique() # 候选人去重\n",
    "unique_cands"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "parties = {'Bachmann, Michelle': 'Republican',\n",
    "           'Cain, Herman': 'Republican',\n",
    "           'Gingrich, Newt': 'Republican',\n",
    "           'Huntsman, Jon': 'Republican',\n",
    "           'Johnson, Gary Earl': 'Republican',\n",
    "           'McCotter, Thaddeus G': 'Republican',\n",
    "           'Obama, Barack': 'Democrat',\n",
    "           'Paul, Ron': 'Republican',\n",
    "           'Pawlenty, Timothy': 'Republican',\n",
    "           'Perry, Rick': 'Republican',\n",
    "           \"Roemer, Charles E. 'Buddy' III\": 'Republican',\n",
    "           'Romney, Mitt': 'Republican',\n",
    "           'Santorum, Rick': 'Republican'} # 构造党派对应信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "123456    Obama, Barack\n",
       "123457    Obama, Barack\n",
       "123458    Obama, Barack\n",
       "123459    Obama, Barack\n",
       "123460    Obama, Barack\n",
       "Name: cand_nm, dtype: object"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec.cand_nm[123456:123461]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "123456    Democrat\n",
       "123457    Democrat\n",
       "123458    Democrat\n",
       "123459    Democrat\n",
       "123460    Democrat\n",
       "Name: cand_nm, dtype: object"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec.cand_nm[123456:123461].map(parties)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Democrat      593746\n",
       "Republican    407985\n",
       "Name: party, dtype: int64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec['party'] = fec.cand_nm.map(parties) # 添加新列\n",
    "fec['party'].value_counts() # 统计各个党派的数量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True     991475\n",
       "False     10256\n",
       "Name: contb_receipt_amt, dtype: int64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(fec.contb_receipt_amt > 0).value_counts() # 出资状况统计，False表示钱又要回去的。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "fec = fec[fec.contb_receipt_amt > 0] # 根据出资条件筛选"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "fec_mrbo = fec[fec.cand_nm.isin(['Obama, Barack', 'Romney, Mitt'])] # 再精简一下范围，只包括奥黑和罗姆尼"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 根据职业和雇主统计赞助信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "RETIRED                                   233990\n",
       "INFORMATION REQUESTED                      35107\n",
       "ATTORNEY                                   34286\n",
       "HOMEMAKER                                  29931\n",
       "PHYSICIAN                                  23432\n",
       "INFORMATION REQUESTED PER BEST EFFORTS     21138\n",
       "ENGINEER                                   14334\n",
       "TEACHER                                    13990\n",
       "CONSULTANT                                 13273\n",
       "PROFESSOR                                  12555\n",
       "Name: contbr_occupation, dtype: int64"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fec.contbr_occupation.value_counts()[:10] # 退休人士如此给力？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "occ_mapping = {'INFORMATION REQUESTED PER BEST EFFORTS' : 'NOT PROVIDED',\n",
    "               'INFORMATION REQUESTED' : 'NOT PROVIDED',\n",
    "               'INFORMATION REQUESTED (BEST EFFORTS)' : 'NOT PROVIDED',\n",
    "               'C.E.O.': 'CEO'} # 职业映射，便于做合并。\n",
    "f = lambda x: occ_mapping.get(x, x) # get的两个参数，第一个是key，第二个是找不key到返回的默认值。\n",
    "fec.contbr_occupation = fec.contbr_occupation.map(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "emp_mapping = {'INFORMATION REQUESTED PER BEST EFFORTS' : 'NOT PROVIDED',\n",
    "               'INFORMATION REQUESTED' : 'NOT PROVIDED',\n",
    "               'SELF' : 'SELF-EMPLOYED',\n",
    "               'SELF EMPLOYED' : 'SELF-EMPLOYED'} # 处理雇主信息\n",
    "f = lambda x: emp_mapping.get(x, x)\n",
    "fec.contbr_employer = fec.contbr_employer.map(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>party</th>\n",
       "      <th>Democrat</th>\n",
       "      <th>Republican</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contbr_occupation</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>MIXED-MEDIA ARTIST / STORYTELLER</th>\n",
       "      <td>100.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AREA VICE PRESIDENT</th>\n",
       "      <td>250.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>RESEARCH ASSOCIATE</th>\n",
       "      <td>100.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>TEACHER</th>\n",
       "      <td>500.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>THERAPIST</th>\n",
       "      <td>3900.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "party                                Democrat  Republican\n",
       "contbr_occupation                                        \n",
       "   MIXED-MEDIA ARTIST / STORYTELLER     100.0         NaN\n",
       " AREA VICE PRESIDENT                    250.0         NaN\n",
       " RESEARCH ASSOCIATE                     100.0         NaN\n",
       " TEACHER                                500.0         NaN\n",
       " THERAPIST                             3900.0         NaN"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "by_occupation = fec.pivot_table('contb_receipt_amt',\n",
    "                                index='contbr_occupation',\n",
    "                                columns='party',\n",
    "                                aggfunc='sum') # 根据捐款总额生成透视表\n",
    "by_occupation.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>party</th>\n",
       "      <th>Democrat</th>\n",
       "      <th>Republican</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contbr_occupation</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>ATTORNEY</th>\n",
       "      <td>11141982.97</td>\n",
       "      <td>7.477194e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CEO</th>\n",
       "      <td>2074974.79</td>\n",
       "      <td>4.211041e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CONSULTANT</th>\n",
       "      <td>2459912.71</td>\n",
       "      <td>2.544725e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>ENGINEER</th>\n",
       "      <td>951525.55</td>\n",
       "      <td>1.818374e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>EXECUTIVE</th>\n",
       "      <td>1355161.05</td>\n",
       "      <td>4.138850e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>HOMEMAKER</th>\n",
       "      <td>4248875.80</td>\n",
       "      <td>1.363428e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>INVESTOR</th>\n",
       "      <td>884133.00</td>\n",
       "      <td>2.431769e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LAWYER</th>\n",
       "      <td>3160478.87</td>\n",
       "      <td>3.912243e+05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>MANAGER</th>\n",
       "      <td>762883.22</td>\n",
       "      <td>1.444532e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>NOT PROVIDED</th>\n",
       "      <td>4866973.96</td>\n",
       "      <td>2.056547e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>OWNER</th>\n",
       "      <td>1001567.36</td>\n",
       "      <td>2.408287e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PHYSICIAN</th>\n",
       "      <td>3735124.94</td>\n",
       "      <td>3.594320e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PRESIDENT</th>\n",
       "      <td>1878509.95</td>\n",
       "      <td>4.720924e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PROFESSOR</th>\n",
       "      <td>2165071.08</td>\n",
       "      <td>2.967027e+05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>REAL ESTATE</th>\n",
       "      <td>528902.09</td>\n",
       "      <td>1.625902e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>RETIRED</th>\n",
       "      <td>25305116.38</td>\n",
       "      <td>2.356124e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SELF-EMPLOYED</th>\n",
       "      <td>672393.40</td>\n",
       "      <td>1.640253e+06</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "party                 Democrat    Republican\n",
       "contbr_occupation                           \n",
       "ATTORNEY           11141982.97  7.477194e+06\n",
       "CEO                 2074974.79  4.211041e+06\n",
       "CONSULTANT          2459912.71  2.544725e+06\n",
       "ENGINEER             951525.55  1.818374e+06\n",
       "EXECUTIVE           1355161.05  4.138850e+06\n",
       "HOMEMAKER           4248875.80  1.363428e+07\n",
       "INVESTOR             884133.00  2.431769e+06\n",
       "LAWYER              3160478.87  3.912243e+05\n",
       "MANAGER              762883.22  1.444532e+06\n",
       "NOT PROVIDED        4866973.96  2.056547e+07\n",
       "OWNER               1001567.36  2.408287e+06\n",
       "PHYSICIAN           3735124.94  3.594320e+06\n",
       "PRESIDENT           1878509.95  4.720924e+06\n",
       "PROFESSOR           2165071.08  2.967027e+05\n",
       "REAL ESTATE          528902.09  1.625902e+06\n",
       "RETIRED            25305116.38  2.356124e+07\n",
       "SELF-EMPLOYED        672393.40  1.640253e+06"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "over_2mm = by_occupation[by_occupation.sum(1) > 2000000] # 超过2M的狗大户，sum(1)代表沿着行的方向相加。\n",
    "over_2mm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x29700643eb8>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nhTUX6J1n/a6S6pnZGgBJ9YDOwDuZdjCzewjxeDRs2c5fYnWutiv0RLscJroll7s66aSTGDlyJJdf\nfnlh25GD7t270717Tq8kVgt/zaOwsgWtt85U2czmAW8ByZi6K4DpcZtzzhXVHnvswSeffFL6fejQ\nofTo0YNOnTpx1VVXAeGub8cdd+Skk06iU6dO9O7du3Tx4pKSEpYsCQsgTZs2rTQaDsLqH/vvvz/t\n2rXj3nvvXevckyZNolevXgCsWLGCk08+mY4dO9KpUycef/xxAAYOHEj37t1p3759aXtS573qqqvo\n1q0bHTt25N133y3sLwa/gyyoCoLW059BPhDzYk8hBLDPIwytTo5lFfKwcufculi9ejUvvfQSp5wS\n/pPzwgsv8MEHHzBlyhTMjCOOOIJXXnmFbbfdlvfee4/777+fvfbaiwEDBnDXXXetNXyabtasWfzr\nX//i22+/pWvXrhx2WPb/Xl177bU0a9aM2bNnA/DVV18BcP3117PZZpuxevVqDjjgAGbNmkWnTp0A\naNGiBdOnT+euu+5i2LBh3HfffYX4tZTyO8gCM7NPzewPZtbWzNqb2WFm9oGZNTazLomfEbH+V2bW\nz8y2j/v0M7Ovq/s6nHN1VyqLtXnz5nz55Zf85je/AUIH+cILL9C1a1e6devGu+++W7rU1TbbbFOa\njdqvX7/SZazKc+SRR9K4cWNatGhBz549mTJlSta6L774ImeffXbp9003Dcv0lrf81THHHAPALrvs\nUrrcViF5B+mcc+uZ1DPIjz76iB9//JGRI0cCYU3ISy+9lBkzZjBjxgzmzZtXeneZvmxV6vsGG2zA\nmjVrANZamirbPpmY2VrbU8tfvfTSS8yaNYvDDjuszDlSy23Vr18/63Jb68I7SOecW081a9aMESNG\nMGzYMH766ScOPvhgHnjgAVasWAHAJ598whdffAHAxx9/zOTJYSncRx55pHQZq5KSEt58M7zdlnpu\nmPLUU0/x/fffs3TpUiZNmkSPHj2ytuWggw7izjt/Xt73q6++yrj8VVXyDtI559ZjXbt2pXPnzjz6\n6KMcdNBBHHfcceyxxx507NiR3r17s3z5cgB22mknHnzwQTp16sSXX37JwIEDAbjqqqs477zz2Gef\nfahfv36ZY++6664cdthh7L777lx55ZVstdVWWdtxxRVX8NVXX9GhQwc6d+7MxIkTyyx/NWDAgDLL\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x297006430b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "over_2mm.plot(kind='barh')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def get_top_amounts(group, key, n=5): # 分组后找key的topX条记录\n",
    "    totals = group.groupby(key)['contb_receipt_amt'].sum()\n",
    "    return totals.sort_values(ascending=False)[:n] # 原来的代码[n:]不对"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "cand_nm        contbr_occupation                     \n",
       "Obama, Barack  RETIRED                                   25305116.38\n",
       "               ATTORNEY                                  11141982.97\n",
       "               INFORMATION REQUESTED                      4866973.96\n",
       "               HOMEMAKER                                  4248875.80\n",
       "               PHYSICIAN                                  3735124.94\n",
       "               LAWYER                                     3160478.87\n",
       "               CONSULTANT                                 2459912.71\n",
       "Romney, Mitt   RETIRED                                   11508473.59\n",
       "               INFORMATION REQUESTED PER BEST EFFORTS    11396894.84\n",
       "               HOMEMAKER                                  8147446.22\n",
       "               ATTORNEY                                   5364718.82\n",
       "               PRESIDENT                                  2491244.89\n",
       "               EXECUTIVE                                  2300947.03\n",
       "               C.E.O.                                     1968386.11\n",
       "Name: contb_receipt_amt, dtype: float64"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grouped = fec_mrbo.groupby('cand_nm')\n",
    "grouped.apply(get_top_amounts, 'contbr_occupation', n=7) # 根据职业"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "cand_nm        contbr_employer                       \n",
       "Obama, Barack  RETIRED                                   22694358.85\n",
       "               SELF-EMPLOYED                             17080985.96\n",
       "               NOT EMPLOYED                               8586308.70\n",
       "               INFORMATION REQUESTED                      5053480.37\n",
       "               HOMEMAKER                                  2605408.54\n",
       "               SELF                                       1076531.20\n",
       "               SELF EMPLOYED                               469290.00\n",
       "               STUDENT                                     318831.45\n",
       "               VOLUNTEER                                   257104.00\n",
       "               MICROSOFT                                   215585.36\n",
       "Romney, Mitt   INFORMATION REQUESTED PER BEST EFFORTS    12059527.24\n",
       "               RETIRED                                   11506225.71\n",
       "               HOMEMAKER                                  8147196.22\n",
       "               SELF-EMPLOYED                              7409860.98\n",
       "               STUDENT                                     496490.94\n",
       "               CREDIT SUISSE                               281150.00\n",
       "               MORGAN STANLEY                              267266.00\n",
       "               GOLDMAN SACH & CO.                          238250.00\n",
       "               BARCLAYS CAPITAL                            162750.00\n",
       "               H.I.G. CAPITAL                              139500.00\n",
       "Name: contb_receipt_amt, dtype: float64"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grouped.apply(get_top_amounts, 'contbr_employer', n=10) # 根据雇主"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 对出资额分组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "411      (10, 100]\n",
       "412    (100, 1000]\n",
       "413    (100, 1000]\n",
       "414      (10, 100]\n",
       "415      (10, 100]\n",
       "Name: contb_receipt_amt, dtype: category\n",
       "Categories (8, interval[int64]): [(0, 1] < (1, 10] < (10, 100] < (100, 1000] < (1000, 10000] < (10000, 100000] < (100000, 1000000] < (1000000, 10000000]]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bins = np.array([0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000])\n",
    "labels = pd.cut(fec_mrbo.contb_receipt_amt, bins) # 根据捐款额划分区间\n",
    "labels.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "grouped = fec_mrbo.groupby(['cand_nm', labels]) # 根据额度分组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cand_nm</th>\n",
       "      <th>Obama, Barack</th>\n",
       "      <th>Romney, Mitt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contb_receipt_amt</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>(0, 1]</th>\n",
       "      <td>493.0</td>\n",
       "      <td>77.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1, 10]</th>\n",
       "      <td>40070.0</td>\n",
       "      <td>3681.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(10, 100]</th>\n",
       "      <td>372280.0</td>\n",
       "      <td>31853.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(100, 1000]</th>\n",
       "      <td>153991.0</td>\n",
       "      <td>43357.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1000, 10000]</th>\n",
       "      <td>22284.0</td>\n",
       "      <td>26186.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(10000, 100000]</th>\n",
       "      <td>2.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(100000, 1000000]</th>\n",
       "      <td>3.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1000000, 10000000]</th>\n",
       "      <td>4.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "cand_nm              Obama, Barack  Romney, Mitt\n",
       "contb_receipt_amt                               \n",
       "(0, 1]                       493.0          77.0\n",
       "(1, 10]                    40070.0        3681.0\n",
       "(10, 100]                 372280.0       31853.0\n",
       "(100, 1000]               153991.0       43357.0\n",
       "(1000, 10000]              22284.0       26186.0\n",
       "(10000, 100000]                2.0           1.0\n",
       "(100000, 1000000]              3.0           NaN\n",
       "(1000000, 10000000]            4.0           NaN"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grouped.size().unstack(0) # 把外层索引变成列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cand_nm</th>\n",
       "      <th>Obama, Barack</th>\n",
       "      <th>Romney, Mitt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contb_receipt_amt</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>(0, 1]</th>\n",
       "      <td>318.24</td>\n",
       "      <td>77.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1, 10]</th>\n",
       "      <td>337267.62</td>\n",
       "      <td>29819.66</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(10, 100]</th>\n",
       "      <td>20288981.41</td>\n",
       "      <td>1987783.76</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(100, 1000]</th>\n",
       "      <td>54798531.46</td>\n",
       "      <td>22363381.69</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1000, 10000]</th>\n",
       "      <td>51753705.67</td>\n",
       "      <td>63942145.42</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(10000, 100000]</th>\n",
       "      <td>59100.00</td>\n",
       "      <td>12700.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(100000, 1000000]</th>\n",
       "      <td>1490683.08</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1000000, 10000000]</th>\n",
       "      <td>7148839.76</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "cand_nm              Obama, Barack  Romney, Mitt\n",
       "contb_receipt_amt                               \n",
       "(0, 1]                      318.24         77.00\n",
       "(1, 10]                  337267.62      29819.66\n",
       "(10, 100]              20288981.41    1987783.76\n",
       "(100, 1000]            54798531.46   22363381.69\n",
       "(1000, 10000]          51753705.67   63942145.42\n",
       "(10000, 100000]           59100.00      12700.00\n",
       "(100000, 1000000]       1490683.08           NaN\n",
       "(1000000, 10000000]     7148839.76           NaN"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bucket_sums = grouped.contb_receipt_amt.sum().unstack(0) # 金额汇总\n",
    "bucket_sums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cand_nm</th>\n",
       "      <th>Obama, Barack</th>\n",
       "      <th>Romney, Mitt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contb_receipt_amt</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>(0, 1]</th>\n",
       "      <td>0.805182</td>\n",
       "      <td>0.194818</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1, 10]</th>\n",
       "      <td>0.918767</td>\n",
       "      <td>0.081233</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(10, 100]</th>\n",
       "      <td>0.910769</td>\n",
       "      <td>0.089231</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(100, 1000]</th>\n",
       "      <td>0.710176</td>\n",
       "      <td>0.289824</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1000, 10000]</th>\n",
       "      <td>0.447326</td>\n",
       "      <td>0.552674</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(10000, 100000]</th>\n",
       "      <td>0.823120</td>\n",
       "      <td>0.176880</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(100000, 1000000]</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(1000000, 10000000]</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "cand_nm              Obama, Barack  Romney, Mitt\n",
       "contb_receipt_amt                               \n",
       "(0, 1]                    0.805182      0.194818\n",
       "(1, 10]                   0.918767      0.081233\n",
       "(10, 100]                 0.910769      0.089231\n",
       "(100, 1000]               0.710176      0.289824\n",
       "(1000, 10000]             0.447326      0.552674\n",
       "(10000, 100000]           0.823120      0.176880\n",
       "(100000, 1000000]         1.000000           NaN\n",
       "(1000000, 10000000]       1.000000           NaN"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "normed_sums = bucket_sums.div(bucket_sums.sum(axis=1), axis=0) # 对每一行数据归一化\n",
    "normed_sums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x2970e152518>"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nZ2ezdetWevfuzT333MO5557Lr371K+bMmcOHH37I8OHDGThwIAcccABz5syhUaNGrFixgsGDB5OX\nV/Xyt3369MHd+fTTT3nuuefKyiuL5cgjj+TOO+8EoEuXLtx2220ADBs2jBkzZnD22WczdOhQxowZ\nw7nnnktRURG7du1i1arIAktvvPEG1113HS+99BIHHXRQUn7uIpJ8SpKSdBW9/aN8eb9+/cjOjrxC\n67zzzuP111+ne/fujBs3jhdfjDzKumrVKlasWEF2djYNGjRgwIDIOvK5ubk0bNiQ+vXrk5ubS35+\nPgDFxcVce+21LF68mKysLD7++OO44p0/fz6tW7fmk08+oW/fvvTu3ZumTZvGjCUrK4vzzz9/t+Pv\nvfdetm3bxvr16zniiCPo3bs3X375Jeeeey4AjRp9t67G8uXLGTlyJLNnz+bAAw9M5EcrItVMSVKS\n7ogjjuCFF17YrWzTpk2sWrWKQw45hHffffd7SdTMWLBgAXPnzuXNN9+kSZMm9O7dm6KiyDoU9evX\nLzumXr16NKzgNVcPPPAAbdq04f3332fXrl27JaZ4HHLIIbRp04YPP/yQbdu2xYylUaNGZGVFJmwX\nFRUxatQo8vLy6NChA3fccQdFRUVEnvqpWNu2bSkqKuK9995TkhTJcJq4I0nXt29ftm3bxsSJE4HI\n5Jaf//znjBgxgiZNIi9PnjNnDuvXr2f79u1MnTqVE088kcLCQlq2bEmTJk3497//zVtvvVVZM99T\nWFhI27ZtqVevHk899dRuk2oOO+ywKo9fu3Ytn332GQcffHDcsZQmztatW7Nlyxaef/55IDK83L59\ne6ZOnQrAjh072LZtGwAtWrTg5Zdf5tZbb2XBggUJ9VFEqpeuJOuA6p4AYma8+OKLjBo1irvuuotd\nu3ZxxhlncPfdd5fVOemkkxg2bBgrV65kyJAhdO/endzcXB599FG6du3KD3/4Q44//viE2h01ahTn\nn38+kydPpk+fPuy7774ArFu3rtIruz59+pCVlUVxcTFjx46lTZs2DBgwIK5YWrRowRVXXEFubi45\nOTn06NGjbN9TTz3FlVdeyW233Ub9+vWZPHly2b42bdowffp0Tj/9dMaPH89xx+3py2pEJJWssn88\nJPN1797dy09OWb58OYcffniaIso8M2bM4NNPP+X6669Pdyhx0+9QJLXM7F13715VPV1JSq131lln\n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\naw8wAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x297007267b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "normed_sums[:-2].plot(kind='barh', stacked=True) # 去掉最后2行，以堆叠柱状图展现。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 根据州统计赞助信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cand_nm</th>\n",
       "      <th>Obama, Barack</th>\n",
       "      <th>Romney, Mitt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contbr_st</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>AK</th>\n",
       "      <td>281840.15</td>\n",
       "      <td>86204.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AL</th>\n",
       "      <td>543123.48</td>\n",
       "      <td>527303.51</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AR</th>\n",
       "      <td>359247.28</td>\n",
       "      <td>105556.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AZ</th>\n",
       "      <td>1506476.98</td>\n",
       "      <td>1888436.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CA</th>\n",
       "      <td>23824984.24</td>\n",
       "      <td>11237636.60</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "cand_nm    Obama, Barack  Romney, Mitt\n",
       "contbr_st                             \n",
       "AK             281840.15      86204.24\n",
       "AL             543123.48     527303.51\n",
       "AR             359247.28     105556.00\n",
       "AZ            1506476.98    1888436.23\n",
       "CA           23824984.24   11237636.60"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grouped = fec_mrbo.groupby(['cand_nm', 'contbr_st']) # 根据候选人和州做分组\n",
    "totals = grouped.contb_receipt_amt.sum().unstack(0).fillna(0) # 各周收到的金额汇总\n",
    "totals = totals[totals.sum(1) > 100000] # 金额大于10万美元的州\n",
    "totals[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>cand_nm</th>\n",
       "      <th>Obama, Barack</th>\n",
       "      <th>Romney, Mitt</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>contbr_st</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>AK</th>\n",
       "      <td>0.765778</td>\n",
       "      <td>0.234222</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AL</th>\n",
       "      <td>0.507390</td>\n",
       "      <td>0.492610</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AR</th>\n",
       "      <td>0.772902</td>\n",
       "      <td>0.227098</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AZ</th>\n",
       "      <td>0.443745</td>\n",
       "      <td>0.556255</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CA</th>\n",
       "      <td>0.679498</td>\n",
       "      <td>0.320502</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "cand_nm    Obama, Barack  Romney, Mitt\n",
       "contbr_st                             \n",
       "AK              0.765778      0.234222\n",
       "AL              0.507390      0.492610\n",
       "AR              0.772902      0.227098\n",
       "AZ              0.443745      0.556255\n",
       "CA              0.679498      0.320502"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "percent = totals.div(totals.sum(1), axis=0) # 各州对候选人的捐助比例\n",
    "percent.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# from shapelib import ShapeFile\n",
    "# import dbflib\n",
    "'''\n",
    "obama = percent['Obama, Barack']\n",
    "fig = plt.figure(figsize=(24, 24))\n",
    "ax = fig.add_axes([0.1,0.1,0.8,0.8])\n",
    "lllat = 21 # 美国的经纬度区间\n",
    "urlat = 53\n",
    "lllon = -118\n",
    "urlon = -62\n",
    "m = Basemap(ax=ax,\n",
    "            projection='stere',\n",
    "            lon_0=(urlon + lllon) / 2,\n",
    "            lat_0=(urlat + lllat) / 2,\n",
    "            llcrnrlat=lllat,\n",
    "            urcrnrlat=urlat,\n",
    "            llcrnrlon=lllon,\n",
    "            urcrnrlon=urlon,\n",
    "            resolution='l')\n",
    "m.drawcoastlines() # 海岸线\n",
    "m.drawcountries() # 国境线\n",
    "shp = ShapeFile('../data/fec/states/statesp020')\n",
    "dbf = dbflib.open('../data/fec/states/statesp020')\n",
    "for npoly in range(shp.info()[0]):\n",
    "    # 在地图上绘制彩色多边形\n",
    "    shpsegs = []\n",
    "    shp_object = shp.read_object(npoly)\n",
    "    verts = shp_object.vertices()\n",
    "    rings = len(verts)\n",
    "    for ring in range(rings):\n",
    "        lons, lats = zip(*verts[ring])\n",
    "        x, y = m(lons, lats)\n",
    "        shpsegs.append(zip(x,y))\n",
    "    if ring == 0:\n",
    "        shapedict = dbf.read_record(npoly)\n",
    "        name = shapedict['STATE']\n",
    "        name = 'Texas'\n",
    "        lines = LineCollection(shpsegs,antialiaseds=(1,))\n",
    "        # state_to_code字典，例如'ALASKA' -> 'AK', omitted\n",
    "        try:\n",
    "            per = obama[state_to_code[name.upper()]]\n",
    "        except KeyError:\n",
    "            continue\n",
    "        lines.set_facecolors('k')\n",
    "        lines.set_alpha(0.75 * per) # 把“百分比”变小一点\n",
    "        lines.set_edgecolors('k')\n",
    "        lines.set_linewidth(0.3)\n",
    "'''\n",
    "pass\n",
    "# TODO: 这块以后再搞吧。。。太TM扯了，ShapeFile和dbflib的安装配置搞不定，数据格式待破解。\n",
    "# 目前尝试了使用以下代码加载数据文件：\n",
    "# import shapefile\n",
    "# shp = shapefile.Reader('../data/fec/states/statesp020')\n",
    "# for shape in shp.shapes():\n",
    "#     不知道该怎么利用shape.points去画图，另外该怎么匹配州的信息？\n",
    "#     代码是利用每个州的比例设置alpha值。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
